// 是否为函数对象
const isCallable = (val) => typeof val === "function";
// 是否为引用值
const isObject = (val) =>
  typeof val === "function" || (val !== null && typeof val === "object");
// ctor 必须是引用值
if (!isObject(ctor))
  throw new TypeError(`Right-hand side of 'instanceof' is not an object`);
// ctor 必须是函数对象
if (!isCallable(ctor))
  throw new TypeError(`Right-hand side of 'instanceof' is not callable`);

const myInstaceOf = (inst, ctor) => {
  // inst 为原始值，则返回 false
  if (!isObject(inst)) return false;
  do {
    let proto = Object.getPrototypeOf(inst); // 获取对象的原型
    // 原型链顶端（proto 为 null）或者 inst 通过 Object.create(null) 构造（proto 为 undefined）
    if (proto == null) return false;
    if (proto === ctor.prototype) return true;
    inst = proto; // 往上一级查找
  } while (true);
};
